﻿using System;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
//возможно тут есть какие-то лишние юзинги :)
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;


namespace Primer_Client_and_Server_Remoting
{
    public class Агент : MarshalByRefObject
    {
        public Агент()
        {
            Console.WriteLine("вызван конструктор");
        }


        public string мои_данные;

        public void Отправить(string данные)
        {
            мои_данные += " " + данные;
            Console.WriteLine("вызван метод Отправить | " + данные);
            //здесь, например, тоже можно создать прокси и вызвать, например, метод Получить()
        }

        public string Получить()
        {
            Console.WriteLine("вызван метод Получить | " + мои_данные);
            return мои_данные;
        }
    }



   class Client_Server
   {
      static void Main(string[] args)
      {

          string мой_порт;
          string удаленный_порт;
          Console.WriteLine("введите мой порт");
          мой_порт = Console.ReadLine();
          Console.WriteLine("введите удаленный_порт");
          удаленный_порт = Console.ReadLine();

          try
          {

              TcpServerChannel server_channel = new TcpServerChannel("имя_канала", Int32.Parse(мой_порт));
              ChannelServices.RegisterChannel(server_channel, false);
              TcpClientChannel client_channel = new TcpClientChannel();



              RemotingConfiguration.RegisterWellKnownServiceType(
                         typeof(Агент),
                         "Агент.soap",
                         WellKnownObjectMode.Singleton
                         );



              Console.WriteLine("нажмите энтер для создание прокси (до этого нужно указать порты в обоих приложениях)");
              Console.ReadLine();



              Агент прокси_локального_агента = (Агент)Activator.GetObject(
                        typeof(Агент),
                        "tcp://localhost:" + мой_порт + "/Агент.soap");

              Агент прокси_удаленного_агента = (Агент)Activator.GetObject(
                         typeof(Агент),
                         "tcp://localhost:" + удаленный_порт + "/Агент.soap");

              прокси_локального_агента.мои_данные = "локальные данные";
              прокси_удаленного_агента.мои_данные = "удаленные данные";
              Console.WriteLine();
              Console.WriteLine("прокси_локального_агента.мои_данные: " + прокси_локального_агента.мои_данные);
              Console.WriteLine("прокси_удаленного_агента.мои_данные: " + прокси_удаленного_агента.мои_данные);
              Console.WriteLine();
              Console.WriteLine("прокси_удаленного_агента.Отправить(''123'');");

              прокси_удаленного_агента.Отправить("123");

              Console.WriteLine("Удаленные данные после отправки: " + прокси_удаленного_агента.мои_данные);
              Console.WriteLine();
              Console.WriteLine("прокси_удаленного_агента.Получить();");
              Console.WriteLine();
              Console.WriteLine("Полученные данные с удаленного агента: " + прокси_удаленного_агента.Получить());
              Console.WriteLine();
             
          }
          catch (Exception ex)
          {
              Console.WriteLine(ex.Message);
          }



         Console.Write("Press enter to end");
         Console.ReadLine();  
      }
   }
}
